package com.weic.easycache.framework.theme;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.content.res.Resources;

public class Theme {
	public static final Theme DAY		= registerTheme("day", null, true, null);
	public static final Theme NIGHT		= registerTheme("night", "night", true, null);
	//当找不到某主题下的某资源的时候，应该应用默认的资源
	public static final Theme DEFAULT	= DAY;

	public final String name;
	public final String suffix;
	/**该主题是否是内置的，已打入程序包，即该主题所需要的全部资源都已包含于res或者assets目录下（字体文件包含于assets下。
	 * 对于非assets下的系统默认的字体，这里只能传字体名称，此时不同的主题将应用相同的字体，即不改变字体，因为系统字体名称
	 * 不支持不同主题的后缀，由本类suffix变量指定；而assets下或外部字体文件，将对字体文件名应用后缀，如：path/font_night.tts）。
	 * 设计为支持动态下载的主题资源（暂未实现）**/
	public final boolean inner;
	/**外部资源文件的路径，对应非内置主题，字体文件也将在该目录下搜索，而不在assets下。**/
	public final String extResDir;

	private Theme(String name, String suffix, boolean inner, String extResDir) {
		this.name = name;
		this.suffix = suffix;
		this.inner = inner;
		this.extResDir = extResDir;
	}

	public String formatResName(String resName) {
		return resName + (suffix == null ? "" : "_" + suffix);
	}

	/**将默认主题资源的resId转换为当前主题下的resId。只针对于内置主题**/
	public int formatResID(int resID, Resources res) {
		return res.getIdentifier(formatResName(res.getResourceName(resID)), null, null);
	}

	/**将默认主题资源的resName转换为当前主题下的resId。只针对于内置主题
	 * @param resName	应该是完整的资源名称："package:type/entry".**/
	public int formatResID(String resName, Resources res) {
		return res.getIdentifier(formatResName(resName), null, null);
	}

	public void apply() {
		ThemePlugin.applyTheme(this);
	}

	public void apply(Context context) {
		ThemePlugin.applyTheme(this, context);
	}

	/**
	 * @param name
	 * @param suffix
	 * @return null 表示该name的Theme已经注册，可通过{@link Theme#getTheme(String name)}来取得已经注册的theme
	 */
	public static Theme registerTheme(String name, String suffix, boolean inner, String extResPath) {
		if(themes.containsKey(name)) return null;
		Theme theme = new Theme(name, suffix, inner, extResPath);
		themes.put(name, theme);
		return theme;
	}

	public static Theme unRegisterTheme(String name) {
		Theme theme = themes.remove(name);
		if(theme == ThemePlugin.currentTheme) ThemePlugin.applyThemeDefault();
		return theme;
	}

	public static Theme getTheme(String name) {
		return themes.get(name);
	}

	public static Theme[] getThemes() {
		return themes.values().toArray(new Theme[themes.size()]);
	}

	private static final Map<String, Theme> themes = new HashMap<String, Theme>();
}
